/**
 * 文件工具类
 * @author 小莫 <xiaomo@ccminicloud.com>
 * @copyright 码上编程 2021-2022
 */

/**
 * 将文件大小转换为可读格式
 * @param {number} size 文件大小（字节）
 * @returns {string} 格式化后的文件大小
 */
function getFormatSize(size) {
    if (size === undefined || size === null || size === 0) {
        return '0B';
    }
    
    const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
    let index = 0;
    let sizeNum = size;
    
    while (sizeNum >= 1024 && index < units.length - 1) {
        sizeNum = sizeNum / 1024;
        index++;
    }
    
    return sizeNum.toFixed(2) + units[index];
}

/**
 * 获取文件扩展名
 * @param {string} fileName 文件名
 * @returns {string} 文件扩展名，不包含点号
 */
function getFileExt(fileName) {
    if (!fileName) return '';
    return fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
}

/**
 * 判断文件类型是否为图片
 * @param {string} fileName 文件名
 * @returns {boolean} 是否为图片类型
 */
function isImageFile(fileName) {
    const ext = getFileExt(fileName);
    const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
    return imageExts.includes(ext);
}

/**
 * 判断文件类型是否为文档
 * @param {string} fileName 文件名
 * @returns {boolean} 是否为文档类型
 */
function isDocFile(fileName) {
    const ext = getFileExt(fileName);
    const docExts = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt'];
    return docExts.includes(ext);
}

/**
 * 获取文件图标样式类
 * @param {string} fileName 文件名
 * @returns {string} 图标样式类名
 */
function getFileIcon(fileName) {
    const ext = getFileExt(fileName);
    
    // 图片类型
    if (isImageFile(fileName)) {
        return 'image';
    }
    
    // 常见文档类型映射到样式类名
    const iconMap = {
        'pdf': 'pdf',
        'doc': 'doc',
        'docx': 'doc',
        'xls': 'xls',
        'xlsx': 'xls',
        'ppt': 'ppt',
        'pptx': 'ppt',
        'txt': 'file',
        'zip': 'zip',
        'rar': 'zip',
        '7z': 'zip'
    };
    
    // 如有特定图标则返回
    if (iconMap[ext]) {
        return iconMap[ext];
    }
    
    // 默认图标
    return 'file';
}

module.exports = {
    getFormatSize,
    getFileExt,
    isImageFile,
    isDocFile,
    getFileIcon
}; 